package TUI;
import java.io.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

import Systeem.*;


public class HotelTUI implements Observer{
	
	private static String commando;
	private Hotel hotel;
	private final static String COMMANDO = "Dit zijn de commando's met de bijhorende parameters:\n" +
											"#reserveer <gast> <aantal personen> <begindatum> <einddatum>\n" +
											"#reserveeradj <gast> <aantal personen> <begindatum> <einddatum>\n" +
											"#checkin <gast> <aantalpersonen> <einddatum>\n" + 
											"#checkout <gast> <datum van vandaag>\n" + 
											"#annuleer <gast> <begindatum> <einddatum>\n" +
											"#print (print een overzicht van de gasten, kamers en reservering)\n" +
											"#help (voor het helpmenu; dit menu)\n\n";
	
	
	public static void main(String[] args) {
		new HotelTUI();
	}
	
	public HotelTUI() {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s;
		hotel = Hotel.getInstance();
		hotel.addObserver(this);
		printBericht(COMMANDO);
		SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
		
		try {
			while (!(s = br.readLine()).equals("#stop")) {
			
				String [] input = s.split(" ");
				commando = input[0];
				
				try {
					String gast = "";
					if(!commando.equals("#print") && !commando.equals("#help")){
						gast = input[1];
						//int aantalPersonen = Integer.parseInt(input[2]);
						//String datum = input[3];
					}
					
					//hier worden de berichten afgehandeld
					if(commando.equals("#checkin")){
						hotel.checkIn(gast, Integer.parseInt(input[2]), sdf.parse(input[3]));
						printBericht("In bovenstaande kamers ingecheckt.\n");
					}
					else if(commando.equals("#reserveer")){
						hotel.reserveer(gast, Integer.parseInt(input[2]), sdf.parse(input[3]), sdf.parse(input[4]),false);
					}
					else if(commando.equals("#reserveeradj")){
						printBericht("De volgende kamers zijn gereserveerd: \n");
						hotel.reserveer(gast, Integer.parseInt(input[2]), sdf.parse(input[3]), sdf.parse(input[4]),true);
					}
					else if(commando.equals("#checkout")){
						hotel.checkOut(gast, sdf.parse(input[2]));
					}
					
					else if(commando.equals("#annuleer")){
						hotel.annuleer(gast, sdf.parse(input[2]), sdf.parse(input[3]));
					}
					
					else if(commando.equals("#print")){
						printBericht("Kamer status: \n" + hotel.getKamers().toString());
						printBericht("---------------------------------------------");
						printBericht("Gasten: \n" + hotel.getGasten().toString());
						printBericht("---------------------------------------------");
						printBericht("Reserveringen: \n" + hotel.vindReserveringen().toString());
						printBericht("---------------------------------------------");
					}
					
					else if(commando.equals("#help")){
						printBericht(COMMANDO);
					}
					
					else {
						printBericht(COMMANDO + "Verkeerde invoer, probeer nogmaals.\n");
					}
				}
				catch (NumberFormatException e) {printBericht(COMMANDO + "Verkeerde invoer, probeer nogmaals.\n");}
				catch (ParseException e) {printBericht("Verkeerde invoer. Datums dienen als volgt te worden ingevoerd: dd-mm-jjjj");}
				catch (Exception e) {printBericht("Er is een onbekende fout opgetreden."); e.printStackTrace();}
				
				
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void printBericht(String bericht){
		System.out.println(bericht);
	}

	@Override
	public void update(Observable obs, Object message) {
		if(message != null)
			printBericht(message.toString());
		else
			printBericht("Mislukt, probeer opnieuw.");
	}
	
}